AWSマネージドサービスで Dify のセルフホスティングを試してみた

AWSマネージドサービスで Dify のセルフホスティングを試してみた

Clock Icon2024.12.22

こんにちは、森田です。

本記事は Dify Advent Calendar 2024の22日目の記事です。

はじめに

Dify をご存知でしょうか。

Dify とは、オープンソースの LLM アプリ開発基盤となっており、ノーコードで誰でも簡単に LLM アプリを作ることができます。

https://dify.ai/jp

Dify は、SaaS版を利用することですぐに利用することもできますが、オープンソースプラットフォームであるため、AWSなどのクラウドサービスを使ってセルフホスティングすることも可能です。

「AWSマネージドサービスを可能な限り使って実現できないかな」と調査していたところ、aws-samplesに以下のリポジトリがありました。

https://github.com/aws-samples/dify-self-hosted-on-aws

dify-self-hosted-on-awsの中身を覗いてみる

image.png

引用:https://github.com/aws-samples/dify-self-hosted-on-aws/blob/main/imgs/architecture.png

構成としては上記の通りになっています。

コンピュートは、ECS Fargateを使っているようです。

ベクトルDBについては、Aurora serverelessを使っているようで、先日のアップデート最小キャパシティ0にも対応しているようでした。

https://github.com/aws-samples/dify-self-hosted-on-aws/pull/4

ElastiCache のエンジンも Valkey が採用されているなど、AWSマネージドサービスを積極的に活用したアーキテクチャになっています。

https://github.com/aws-samples/dify-self-hosted-on-aws/commit/cc72702bbd9b2e5eab679993798a291422cfb1d9

また、コストも$53.8/month〜となっているようで、ランニングコストを抑えたいケースにも合致しそうです。

本記事では、実際にこのリポジトリを使って、AWS環境へデプロイまでやってみます。

やってみた

今回は、CloudShellを使ってデプロイを行います。

手順はREADME.mdにも記載されているので、そちらも併せてご参照ください。

CloudShell の起動

AWSマネジメントコンソールにサインイン後、「shell」などで検索を行い、CloudShellを起動します。

img.png

リポジトリのクローン

https://github.com/aws-samples/dify-self-hosted-on-aws

上記のリポジトリをCloudShellでクローンします。

git clone https://github.com/aws-samples/dify-self-hosted-on-aws.git

AWS CDK を使ってのデプロイ

各リソースは、AWS CDKを使ってデプロイします。

まずは、dify-self-hosted-on-awsディレクトリに移動し、必要なモジュールをインストールします。

cd dify-self-hosted-on-aws/
npm ci

バージニア(us-east-1)で初めてCDKを利用する際には、bootstrapを実行します。

npx cdk bootstrap

今回は、ランニングコストを抑えた構成を取りたいので、lib/cdk.tsのコメントアウトを外します。

lib/cdk.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { DifyOnAwsStack } from '../lib/dify-on-aws-stack';

const app = new cdk.App();
new DifyOnAwsStack(app, 'DifyOnAwsStack', {
  env: {
    region: 'us-west-2',
    // You need to explicitly set AWS account ID when you look up an existing VPC.
    // account: '123456789012'
  },
  // Allow access from the Internet. Narrow this down if you want further security.
  allowedCidrs: ['0.0.0.0/0'],
  // Set Dify version
  difyImageTag: '0.13.1',

  // uncomment the below for cheap configuration:
>  isRedisMultiAz: false,
>  cheapVpc: true,
>  enableAuroraScalesToZero: true,

  // Please see DifyOnAwsStackProps in lib/dify-on-aws-stack.ts for all the available properties
});

その後、以下のコマンドを実行して、デプロイを完了させます。

npx cdk deploy

デプロイが完了すると以下のようにアプリケーションのURLが表示されます。

実行結果
Do you wish to deploy these changes (y/n)? y
DifyOnAwsStack: deploying... [1/1]
DifyOnAwsStack: creating CloudFormation changeset...

 ✅  DifyOnAwsStack

✨  Deployment time: 1269.82s

Outputs:
DifyOnAwsStack.DifyUrl = http://xxxxxxxxyyyyyyyy.us-west-2.elb.amazonaws.com
Stack ARN:
arn:aws:cloudformation:us-west-2:000000000000:stack/DifyOnAwsStack/xxxxxxxxyyyyyyyy

✨  Total time: 1289.56s

Dify にサインイン

アプリケーションのURLのアクセスします。

アクセス後は、アカウント設定、サインインまで行います。

貼り付けた画像_2024_12_22_22_55.png

サインイン後は以下のようなページが開きます。

img.png

Amazon Bedrock の有効化

サインイン後、右上のアイコンから設定を開きます。

img.png

「モデルプロバイダー」からBedrockのセットアップを行います。

img.png

何も入力なしで「保存」をクリックします。

Bedrockへのアクセスは、IAMを使って許可されているため、アクセスキーの設定は不要です。

img.png

Bedrock 有効化後は、利用可能なモデルが確認できます。

img.png

動作確認

動作確認のためワークフローを作ってみます。

名前を「bedrock」にして「作成する」をクリックします。

img.png

LLMブロックを追加して、Bedrockのモデルを選択します。(今回はNova Proとしています。)

image.png

ワークフロー作成後、「公開する」をクリックし、アプリから動作確認を行います。

image.png

input_textに「AWSとは」と入力し、Executeをクリックすると、画面右側で生成結果が表示されます。

img.png

無事に動作確認できました。

あと片付け

環境を削除する際も、コマンドを実行するだけ完了です。

npx cdk destroy --force

さいごに

SaaS版ではセキュリティ要件を満たせない、カスタマイズをしたいようなケースでは、Dify のセルフホスティングを検討することになりますが、その場合インフラの運用コストなどが発生してしまいます。

今回のアーキテクチャのようにマネージドサービスを活用することで運用コストの削減が期待できます。

また、デプロイ自体もコマンド数回で、お手軽なのでぜひみなさんも試してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.